#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 1.简述面向对象三大特性并用代码表示。
"""
# 1. 封装：将函数封装到对象，方便使用。将对象的值封装到类中，方便调用。
class Show(object):
    def __int__(self, name, age):
        self.name = name
        self.age = age

    def func(self):
        pass

# 2.继承：子类可以继承基类的方法和参数。
class Show(object):
    def __init__(self):
        pass

    def func(self):
        pass

class Foo(object,Show):
    def __init__(self):
        pass

# 3.多态：可接接受不同类型且符合相同条件的数据类型。
class Show(object):
    def __init__(self, val):
        self.val = val[2:]
"""

# 2.什么是鸭子模型？
"""
函数传入的参数可以是任意类型，且同时符合同一个条件，比如是一个可迭代类型。
"""

# 3.列举面向对象中的类成员和对象成员。
"""
类成员：
    1.类变量
    2.方法
    3.类方法
    4.静态方法
    5.属性
对象成员：
    1.实例变量
"""

# 4.@classmethod和@staticmethod的区别?
"""
calssmethod是类方法
staticmethod是静态方法
都可以被类和对象引用
"""

# 5.Python中双下滑 __ 有什么作用？
"""
成员修饰符，加入__除了自己本身，其他地方都无法引用这个方法，
"""

# 6.看代码写结果
"""
class Base:
    x = 1
    
obj = Base()


print(obj.x) # 1
obj.y = 123
print(obj.y) # 123
obj.x = 123
print(obj.x) # 123
print(Base.x) # 1
"""

# 7.看代码写结果
"""
class Parent:
    x = 1
    
class Child1(Parent):
    pass

class Child2(Parent):
    pass

print(Parent.x,Child1.x,Child2.x)   # 1 1 1
Child2.x = 2
print(Parent.x,Child1.x,Child2.x)   # 1 1 2
Child1.x = 3
print(Parent.x,Child1.x,Child2.x)   # 1 3 2
"""

# 8.看代码写结果
"""
class Foo(object):
    n1 = '武沛齐'
    n2 = '金老板'
    def __init__(self):
        self.n1 = '女神'

obj = Foo()
print(obj.n1) # 女神
print(obj.n2) # 金老板
"""

# 9.看代码写结果【如果有错误，则标注错误即可，并且假设程序报错可以继续执行】
"""
class Foo(object):
    n1 = '武沛齐'
    def __init__(self,name):
        self.n2 = name
        
obj = Foo('太白')

print(obj.n1)   # 武沛齐
print(obj.n2)   # 太白

print(Foo.n1)   # 武沛齐
print(Foo.n2)   # 错误
"""

# 10.看代码写结果【如果有错误，则标注错误即可，并且假设程序报错可以继续执行】
"""
class Foo(object):
    a1 = 1
    __a2 = 2
    
    def __init__(self,num):
        self.num = num
        self.__salary = 1000
        
     def show_data(self):
         print(self.num+self.a1)
    
obj = Foo(666)

print(obj.num)          # 666
print(obj.a1)           # 1
print(obj.__salary)     # 错误
print(obj.__a2)         # 错误
print(Foo.a1)           # 1
print(Foo.__a2)         # 错误
"""

# 11.看代码写结果【如果有错误，则标注错误即可，并且假设程序报错可以继续执行】
"""
class Foo(object):
    a1 = 1
    
    def __init__(self,num):
        self.num = num
    def show_data(self):
        print(self.num+self.a1)
    
obj1 = Foo(666)
obj2 = Foo(999)

print(obj1.num)     # 666
print(obj1.a1)      # 1

obj1.num = 18
obj1.a1 = 99

print(obj1.num)     # 18
print(obj1.a1)      # 99

print(obj2.a1)      # 1
print(obj2.num)     # 999
print(obj2.num)     # 999
print(Foo.a1)       # 1
print(obj1.a1)      # 99
"""

# 12.看代码写结果，注意返回值。
"""
class Foo(object):
    
    def f1(self):
        return 999
    
    def f2(self):
        v = self.f1()
        print('f2')
        return v
    
    def f3(self):
        print('f3')
        return self.f2()
    
    def run(self):
        result = self.f3()
        print(result)

obj = Foo()
v1 = obj.run()
print(v1)
# f3
# f2
# 999
# None
"""

# 13.看代码写结果【如果有错误，则标注错误即可，并且假设程序报错可以继续执行】
"""
class Foo(object):
    
    def f1(self):
        print('f1')

    @staticmethod
    def f2():
        print('f2')
        
obj = Foo()

obj.f1()    # f1
obj.f2()    # f2

Foo.f1()    # 错误
Foo.f2()    # f2
"""

# 14.看代码写结果【如果有错误，则标注错误即可，并且假设程序报错可以继续执行】
"""
class Foo(object):
    
    def f1(self):
        print('f1')

    @classmethod
    def f2(cls):
        print('f2')
        
obj = Foo()

obj.f1()    # f1
obj.f2()    # f2

Foo.f1()    # 错误
Foo.f2()    # f2
"""

# 15.看代码写结果【如果有错误，则标注错误即可，并且假设程序报错可以继续执行】
"""
class Foo(object):
    
    def f1(self):
        print('f1')
        self.f2()
        self.f3()

    @classmethod
    def f2(cls):
          print('f2')

    @staticmethod
    def f3():
          print('f3')

obj = Foo()
obj.f1()
# f1
# f2
# f3
"""

# 16.看代码写结果【如果有错误，则标注错误即可，并且假设程序报错可以继续执行】
"""
class Base(object):
    @classmethod
    def f2(cls):
          print('f2')

    @staticmethod
    def f3():
          print('f3')

class Foo(object):
    def f1(self):
        print('f1')
        self.f2()
        self.f3()

obj = Foo()
obj.f1()
# f1
"""

# 17.看代码写结果
"""
class Foo(object):
    def __init__(self, num):
        self.num = num
        
v1 = [Foo for i in range(10)]
v2 = [Foo(5) for i in range(10)]
v3 = [Foo(i) for i in range(10)]

print(v1)   # [Foo对象,Foo对象,Foo对象,Foo对象,Foo对象,Foo对象,Foo对象,Foo对象,Foo对象,Foo对象]
print(v2)   # [num=5的Foo对象,num=5的Foo对象,num=5的Foo对象,
            num=5的Foo对象,num=5的Foo对象,num=5的Foo对象,
            num=5的Foo对象,num=5的Foo对象,num=5的Foo对象,
            num=5的Foo对象]
print(v3)   # [num=0的Foo对象,num=1的Foo对象,num=2的Foo对象,
            num=3的Foo对象,num=4的Foo对象,num=5的Foo对象,
            num=6的Foo对象,num=7的Foo对象,num=8的Foo对象,
            num=9的Foo对象,]
"""

# 18.看代码写结果
"""
class StarkConfig(object):

    def __init__(self, num):
        self.num = num

    def changelist(self, request):
        print(self.num, request)


config_obj_list = [StarkConfig(1), StarkConfig(2), StarkConfig(3)]
for item in config_obj_list:
    print(item.num)
# 1
# 2
# 3
"""

# 19.看代码写结果
"""
class StarkConfig(object):

    def __init__(self, num):
        self.num = num

    def changelist(self, request):
        print(self.num, request)


config_obj_list = [StarkConfig(1), StarkConfig(2), StarkConfig(3)]
for item in config_obj_list:
    item.changelist(666)
# 1 666
# 2 666
# 3 666
"""

# 20.看代码写结果
"""
class Department(object):
    def __init__(self,title):
        self.title = title

class Person(object):
    def __init__(self,name,age,depart):
        self.name = name
        self.age = age 
        self.depart = depart
        
        
d1 = Department('人事部')
d2 = Department('销售部')

p1 = Person('武沛齐',18,d1)
p2 = Person('alex',18,d1)
p3 = Person('安安',19,d2)

print(p1.name)              # 武沛齐
print(p2.age)               # 18
print(p3.depart)            # d2对象
print(p3.depart.title)      # 销售部
"""

# 21.看代码写结果
"""
class Department(object):
    def __init__(self,title):
        self.title = title

class Person(object):
    def __init__(self,name,age,depart):
        self.name = name
        self.age = age 
        self.depart = depart
	
    def message(self):
        msg = "我是%s,年龄%s,属于%s" %(self.name,self.age,self.depart.title)
        print(msg)
    
    
d1 = Department('人事部')
d2 = Department('销售部')

p1 = Person('武沛齐',18,d1)
p2 = Person('alex',18,d1)
p1.message()        # 我是武沛齐，年龄18，属于人事部
p2.message()        # 我是alex，18，属于人事部
"""

# 22.编写类完成以下的嵌套关系
"""
角色：学校、课程、班级
要求：
	1. 创建北京、上海、深圳三所学校。
	2. 创建课程
		北京有三种课程：Linux、Python、Go
		上海有两种课程：Linux、Python
		深圳有一种课程：Python
	3. 创建班级(班级包含：班级名称、开班时间、结课时间、班级人数)
		北京Python开设：21期、22期
		北京Linux开设：2期、3期
		北京Go开设：1期、2期
		上海Python开设：1期、2期
		上海Linux开设：2期
		深圳Python开设：1期、2期
"""

"""
class City(object):
    def __init__(self, city):
        self.city = city


class Course(object):
    def __init__(self, **kwargs):
        self.coures = kwargs


class ClassRoom(object):
    def __init__(self, classroom, city, course, star_time=None, end_time=None, num=None):
        self.classroom = classroom
        self.star_time = star_time
        self.end_time = end_time
        self.num = num
        self.city = city
        self.course = course

    def run(self):
        print('%s%s开设:%s' % (self.city.city, self.course.coures['p'], self.classroom))


C1 = City('北京')
C2 = City('上海')
C3 = City('深圳')

COU1 = Course(**{'l': 'Linux', 'p': 'python', 'g': 'Go'})
COU2 = Course(**{'l': 'Linux', 'p': 'python'})
COU3 = Course(**{'p': 'python'})

CSS1 = ClassRoom('21期', C1, COU1)

CSS1.run()
"""